#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
using namespace std;

// 函数声明
int countChars(ifstream& file);
int countWords(ifstream& file);
int countSentences(ifstream& file);
int countLines(ifstream& file);
int countBlankLines(ifstream& file);
int countCommentLines(ifstream& file);
void resetFile(ifstream& file);
bool isEmptyFile(ifstream& file);  // 新增：判断文件是否为空

int main(int argc, char *argv[]) {
    if (argc != 3) {
        puts("用法：wc.exe [参数] 文件名");
        puts("参数说明：");
        puts("  -c    统计字符数");
        puts("  -w    统计单词数");
        puts("  -s    统计句子数");
       
        return 1;
    }

    char *param = argv[1];
    char *filename = argv[2];

    ifstream file(filename);
    if (!file.is_open()) {
        puts("错误：文件无法打开！");
        return 1;
    }

    // 新增：检查文件是否为空
    if (isEmptyFile(file)) {
        puts("提示：文件为空！");
        file.close();
        return 0;
    }

    // 根据参数执行统计（统计前先重置文件指针，因为isEmptyFile已移动指针）
    resetFile(file);
    if (strcmp(param, "-c") == 0) {
        printf("字符数：%d\n", countChars(file));
    } else if (strcmp(param, "-w") == 0) {
        printf("单词数：%d\n", countWords(file));
    } else if (strcmp(param, "-s") == 0) {
        printf("句子数：%d\n", countSentences(file));
    }  else {
        puts("错误：无效参数！");
        file.close();
        return 1;
    }

    file.close();
    return 0;
}

// 新增：判断文件是否为空
bool isEmptyFile(ifstream& file) {
    // 移动文件指针到末尾
    file.seekg(0, ios::end);
    // 若文件大小为0，则为空文件
    return (file.tellg() == 0);
}

// 统计字符数
int countChars(ifstream& file) {
    int count = 0;
    char ch;
    while (file.get(ch)) {
        count++;
    }
    return count;
}

// 统计单词数
int countWords(ifstream& file) {
    int count = 0;
    bool inWord = false;
    char ch;
    while (file.get(ch)) {
        if (isspace(ch)) {
            inWord = false;
        } else if (!inWord) {
            count++;
            inWord = true;
        }
    }
    return count;
}

// 统计句子数
int countSentences(ifstream& file) {
    int count = 0;
    char ch;
    while (file.get(ch)) {
        if (ch == '.' || ch == '!' || ch == '?') {
            count++;
        }
    }
    return count;
}

// 重置文件指针到开头
void resetFile(ifstream& file) {
    file.clear();
    file.seekg(0);
}